/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package obtenciondatos;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.String;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import twitter4j.IDs;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;

/**
 *
 */
public class ExtractorDatos {

    private Twitter twitter;
    private ArrayList<Usuario> usuarios;
    int querys;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        //String query ="gripa";

        String query = args[0];

        if (args[0] != null) {

            try {


                System.out.println("Consulta: " + query);

                ExtractorDatos ed = new ExtractorDatos();
                ArrayList<Tweet> tweets = ed.obtenerTweets(query);

                ed.obtenerInfoUsuarios(tweets);

                 ArrayList<String> amigos = ed.obtenerAmigos(tweets);
                ArrayList<String> seguidores = ed.obtenerSeguidores(tweets);




                // AlmacenamientoDatos almacenador = new AlmacenamientoDatos(tweets, amigos, seguidores);

                AlmacenamientoDatos almacenador = new AlmacenamientoDatos(tweets, amigos, seguidores);

                String fecha = (new Date()).toString().trim().replaceAll(" ", ",").replaceAll(":", ",");
                System.out.println("Fecha: " + fecha);
                //almacenador.generarArchivoTweets("/opt/sge62/Twitter/csv/tweets,"+fecha+".csv");

                almacenador.generarArchivoTweets("/opt/sge62/Twitter/csv/tweets," + fecha + ".csv");

                 almacenador.GenerarArchivoAmigos("/opt/sge62/Twitter/csv/friends,"+fecha+".csv");

                 almacenador.GenerarArchivoSeguidores("followers,"+fecha+".csv");
                 almacenador.GenerarArchivoUsuarios("/opt/sge62/Twitter/csv/users"+fecha+".csv", ed.usuarios);

                //almacenador.GenerarArchivoUsuarios("users," + fecha + ".csv", ed.usuarios);
            } catch (IOException ex) {
                Logger.getLogger(ExtractorDatos.class.getName()).log(Level.SEVERE, null, ex);
            } catch (TwitterException ex) {
                Logger.getLogger(ExtractorDatos.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public ExtractorDatos() {

        AccessToken accessToken = loadAccessToken();

        twitter = new TwitterFactory().getInstance();

        twitter.setOAuthConsumer("9q4BPEfqlCyvJ0f5IPO4gg", "a3cGRgdNpj2aP7We6ZcwlLJ8eYOWkEY6aVaYsxmj8");
        twitter.setOAuthAccessToken(accessToken);

        usuarios = new ArrayList<Usuario>();
    }

    private static AccessToken loadAccessToken() {

        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("/opt/sge62/Twitter/twitter4j.properties"));
            //properties.load(new FileInputStream("twitter4j.properties"));
        } catch (IOException e) {
        }

        String token = properties.getProperty("oauth.accessToken");

        System.out.println(token);
        String tokenSecret = properties.getProperty("oauth.accessTokenSecret");
        System.out.println(tokenSecret);

        return new AccessToken(token, tokenSecret);
    }

    private ArrayList<Tweet> obtenerTweets(String theQuery) {

        ArrayList<Tweet> tweets = new ArrayList<Tweet>();

        try {


            Query query = new Query(theQuery);
            // para que solamente salgan resultados en inglés
            query.setLang("en");
            // TwitterFactory factory = new TwitterFactory();




            /*System.out.println("Credentials!!!!!");

            System.out.println();
            System.out.println( twitter.verifyCredentials()) ;
            System.out.println();
            System.out.println("Credentials!!!!!");
            System.out.println(); System.out.println(); System.out.println(); */

            System.out.println("Query: " + query);


            QueryResult result = twitter.search(query);
            System.out.println("hits:");

            List<Tweet> resultados = result.getTweets();
            for (int i = 0; i < resultados.size(); i++) {

                Tweet tweet = resultados.get(i);

                tweets.add(tweet);
                /* System.out.println(tweet.getFromUser() + ":" + tweet.getText());

                System.out.println("From: " + tweet.getFromUserId());
                System.out.println("To: " + tweet.getToUserId());

                System.out.println("Followers");

                try {
                System.out.println(tweet.getFromUser());
                System.out.println(twitter.getFollowersIDs(tweet.getFromUser(),-1).getIDs().length);
                } catch (Exception e) {
                System.out.println("No se pudo");
                }

                System.out.println("Friends");

                try {
                System.out.println(tweet.getFromUser());


                System.out.println(twitter.getFriendsIDs(tweet.getFromUser(), -1).getIDs().length);
                } catch (Exception e) {
                System.out.println("No se pudo");
                }

                System.out.println("Next: !!!!!!!!");*/
            }

            // Status status = twitter.updateStatus("twitter4j");


        } catch (TwitterException ex) {
            Logger.getLogger(ExtractorDatos.class.getName()).log(Level.SEVERE, null, ex);
        }

        return tweets;
    }

    private ArrayList<String> obtenerAmigos(ArrayList<Tweet> tweets) throws TwitterException {

        ArrayList<String> amigos = new ArrayList<String>();
        for (Tweet tweet : tweets) {

            IDs idsAmigos = twitter.getFriendsIDs(tweet.getFromUser(), -1);



            long[] idsA = idsAmigos.getIDs();

            for (int i = 0; i < idsA.length; i++) {
                amigos.add(tweet.getFromUserId() + ";" + idsA[i]);

                // System.out.println(tweet.getFromUserId()+","+idsA[i]);
            }

            /*System.out.println();
            System.out.println();
            System.out.println();*/
        }

        return amigos;
    }

    private ArrayList<String> obtenerSeguidores(ArrayList<Tweet> tweets) throws TwitterException {

        ArrayList<String> seguidores = new ArrayList<String>();
        for (Tweet tweet : tweets) {

            IDs idsFollowers = twitter.getFollowersIDs(tweet.getFromUser(), -1);
            User showUser = twitter.showUser(tweet.getFromUser());
            System.out.println("location");
            System.out.println(showUser.getLocation());


            long[] idsA = idsFollowers.getIDs();

            for (int i = 0; i < idsA.length; i++) {
                seguidores.add(tweet.getFromUserId() + ";" + idsA[i]);

                // System.out.println(tweet.getFromUserId() + "," + idsA[i]);
            }

            System.out.println();
            System.out.println();
            System.out.println();
        }

        return seguidores;
    }

    /**
     * genera los registros a aprtir del arraylist con los tweets obtenidos
     * @param tweets tweets obtenidos por la consulta
     */
    private void obtenerInfoUsuarios(ArrayList<Tweet> tweets) throws TwitterException {

        for (Tweet tweet : tweets) {
            Usuario usNuevo = new Usuario();

            // guarda el nombre de la persona

            usNuevo.setNombreUsuario(tweet.getFromUser());
            usNuevo.setId(tweet.getFromUserId());

            // saca la ubicación del usuario que envía el tweet
            String ubicacionUsuario = obtenerUbicacionDeUsuarioTweet(tweet);
            usNuevo.setUbicacion(ubicacionUsuario);

            // obtiene los amigos totales del usuario que envía el tweet
            int amingosTotales = obtenerAmigosTotalesUsuarioTweet(tweet);
            usNuevo.setAmigosTotales(amingosTotales);

            // obtiene los seguidores totales del usuario que envía el tweet
            int seguidoresTotales = obtenerSeguidoresTotalesUsuarioTweet(tweet);
            usNuevo.setSeguidoresTotales(seguidoresTotales);

            // obtiene los mensajes totales del usuario que envía el tweet
            int numMensajes = obtenerMensajesTotalesUsuarioTweet(tweet);
            usNuevo.setMensajesTotales(numMensajes);

            // obtenerListaAmigos(tweet, usNuevo);

            // obtenerListaSeguidores(tweet, usNuevo);
            usuarios.add(usNuevo);
        }


    }

    /**
     * retorna la ubicación registrada del usuario que envió un tweet
     * @param tweet
     * @return
     */
    private String obtenerUbicacionDeUsuarioTweet(Tweet tweet) throws TwitterException {

        User showUser = twitter.showUser(tweet.getFromUser());
        String ubicacion = showUser.getLocation();

        if (ubicacion == null) {
            return "null";
        } else {
            if (ubicacion.equals("")) {
                return "null";
            } else {
                return ubicacion;
            }
        }



    }

    /**
     * obtiene los amigos del usuario que envía el tweet
     * @param tweet
     * @return
     */
    private int obtenerAmigosTotalesUsuarioTweet(Tweet tweet) throws TwitterException {
        User showUser = twitter.showUser(tweet.getFromUser());
        return showUser.getFriendsCount();
    }

    /**
     * obtiene los seguidores del usuario que envía el tweet
     * @param tweet
     * @return
     */
    private int obtenerSeguidoresTotalesUsuarioTweet(Tweet tweet) throws TwitterException {
        User showUser = twitter.showUser(tweet.getFromUser());
        return showUser.getFollowersCount();

    }

    /**
     * obtiene los mensajes totales que el usuario ha enviado
     * @param tweet
     * @return
     * @throws TwitterException
     */
    private int obtenerMensajesTotalesUsuarioTweet(Tweet tweet) throws TwitterException {
        User showUser = twitter.showUser(tweet.getFromUser());
        return showUser.getStatusesCount();
    }

    /**
     * obtiene la lista de amigos, lista de seguidores del usuario que envía el tweet, el resultado se lo agrega a usNuevo
     * @param tweet
     * @param usNuevo
     */
    private void obtenerListaAmigos(Tweet tweet, Usuario usNuevo) throws TwitterException {

        IDs idsFriends = twitter.getFriendsIDs(tweet.getFromUser(), -1);



        String lista = new String();

        long[] idsA = idsFriends.getIDs();

        for (int i = 0; i < idsA.length; i++) {

            User showUser = twitter.showUser(idsA[i]);

            lista += showUser.getName() + ",";
            // System.out.println(showUser.getScreenName());
            // System.out.println(tweet.getFromUserId() + "," + idsA[i]);
        }

        usNuevo.setListaAmigos(lista);

    }

    /**
     * obtiene la lista de seguidores del usuario que envía el tweet, el resultado se lo agrega a usNuevo
     * @param tweet
     * @param usNuevo
     */
    private void obtenerListaSeguidores(Tweet tweet, Usuario usNuevo) throws TwitterException {

        IDs idsFollowers = twitter.getFollowersIDs(tweet.getFromUser(), -1);



        String lista = new String();

        long[] idsA = idsFollowers.getIDs();

        for (int i = 0; i < idsA.length; i++) {

            User showUser = twitter.showUser(idsA[i]);

            lista += showUser.getName() + ",";
            // System.out.println(showUser.getScreenName());
            // System.out.println(tweet.getFromUserId() + "," + idsA[i]);
        }

        usNuevo.setListaSeguidores(lista);

    }
}
